﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 避让行为 - Boid算法的核心行为之一（分离行为）
/// 使个体远离过于接近的邻居，避免碰撞和过度聚集
/// 可在编辑器中创建：Create > Flock > Behavior > Avoidance
/// </summary>
[CreateAssetMenu(menuName = "Flock/Behavior/Avoidance")]
public class AvoidanceBehavior : FilteredFlockBehavior
{
    /// <summary>
    /// 计算避让行为的移动向量
    /// 检测过于接近的邻居并计算远离它们的向量
    /// </summary>
    /// <param name="agent">当前个体</param>
    /// <param name="context">邻居对象列表</param>
    /// <param name="flock">所属群体</param>
    /// <returns>避让行为的移动向量</returns>
    public override Vector2 CalculateMove(FlockAgent agent, List<Transform> context, Flock flock)
    {
        // 如果没有邻居，无需调整
        if (context.Count == 0)
            return Vector2.zero;

        // 计算避让向量
        Vector2 avoidanceMove = Vector2.zero;
        int nAvoid = 0;
        
        // 应用过滤器（如果存在）
        List<Transform> filteredContext = (filter == null) ? context : filter.Filter(agent, context);
        
        // 检查每个邻居是否过于接近
        foreach (Transform item in filteredContext)
        {
            // 计算与邻居的距离平方（优化性能）
            float distanceSquared = Vector2.SqrMagnitude(item.position - agent.transform.position);
            
            // 如果在避免半径内，计算远离向量
            if (distanceSquared < flock.SquareAvoidanceRadius)
            {
                nAvoid++;
                // 计算从邻居指向当前个体的向量（远离方向）
                avoidanceMove += (Vector2)(agent.transform.position - item.position);
            }
        }
        
        // 如果有需要避让的邻居，计算平均避让向量
        if (nAvoid > 0)
            avoidanceMove /= nAvoid;

        return avoidanceMove;
    }
}
